from sqlmodel import Session, create_engine, select
from sqlalchemy.pool import QueuePool

from app.core.config import settings
from app.models import User, UserCreate
from app import  models,crud

# Configure the database engine with proper connection pool settings to prevent timeout issues
engine = create_engine(
    str(settings.SQLALCHEMY_DATABASE_URI),
    poolclass=QueuePool,
    pool_size=10,  # Number of connection objects to maintain in the pool
    max_overflow=20,  # Number of connections that can be created beyond pool_size
    pool_pre_ping=True,  # Verify connections before using them
    pool_recycle=3600,  # Recycle connections after 1 hour (3600 seconds)
    echo=False  # Set to True to log SQL statements for debugging
)


# make sure all SQLModel models are imported (app.models) before initializing DB
# otherwise, SQLModel might fail to initialize relationships properly
# for more details: https://github.com/fastapi/full-stack-fastapi-template/issues/28


async def init_db(session: Session) -> None:
    # Tables should be created with Alembic migrations
    # But if you don't want to use migrations, create
    # the tables un-commenting the next lines
    # from sqlmodel import SQLModel

    # from app.core.engine import engine
    # This works because the models are already imported and registered from app.models
    # SQLModel.metadata.create_all(engine)

    user = session.exec(
        select(User).where(User.email == settings.FIRST_SUPERUSER)
    ).first()
    if not user:
        user_in = UserCreate(
            email=settings.FIRST_SUPERUSER,
            password=settings.FIRST_SUPERUSER_PASSWORD,
            is_superuser=True,
            registrationMethod='邮件',
            status='启用',
            phone=''
        )
        user= await crud.User(db=session).create(data=user_in)
        
